package com.congwulin.wechat.util.service.vo;

import com.congwulin.wechat.entity.common.SuperVO;
import com.congwulin.wechat.util.EntityConst;
import com.congwulin.wechat.util.ExceptionUtils;
import com.congwulin.wechat.util.SpringUtil;
import com.congwulin.wechat.util.UserInfoUtil;
import com.congwulin.wechat.util.interfaces.AbstractVOService;

import java.sql.Timestamp;
import java.util.Arrays;
import java.util.List;

public class VOInsertService extends AbstractVOService {


    /**
     * 实体抽象服务构造函数
     *
     * @param dao 实体保存数据库器
     */
    public VOInsertService(VOPersistent dao) {
        super(dao);
    }

    /**
     * 新增实体数组
     *
     * @param vos
     *            实体数组
     */
    public List<?> insert(SuperVO[] vos) {
        List<SuperVO> list = Arrays.asList(vos);
        return this.insert(list);
    }

    /**
     * 新增实体列表
     *
     * @param list
     *            实体列表
     *
     */
    @SuppressWarnings("unchecked")
    public List<?> insert(List<?> list) {
        List<SuperVO> paralist = (List<SuperVO>) list;

        for(SuperVO vo:paralist){
            vo.setStatus(EntityConst.INSERT);
        }

        // 设置新增审计信息
        this.setNewAuditInfo(paralist);
        // DR=0
        this.setDr(paralist);
        try {
            this.getDAO().insertWithID(paralist);
        } catch (Exception ex) {
            // 继续向上抛出异常
            ExceptionUtils.wrapException(ex);
        }
        return list;
    }

    /**
     * 设置创建人创建时间，包括表头表体
     * @param list
     */
    private void setNewAuditInfo(List<SuperVO> list) {
        // 创建时间
        Timestamp creationtime = new Timestamp(System.currentTimeMillis());
        // 创建人
        UserInfoUtil util = SpringUtil.getBean(UserInfoUtil.class);
        String creator = util.getContent().getId();
        String creatorname = util.getContent().getName();
        for (SuperVO vo : list) {
            vo.setCreationtime(creationtime);
            vo.setCreator(creator);
            vo.setCreator_name(creatorname);
        }
    }

    /**
     * 设置默认dr
     *
     * @param list
     */
    private void setDr(List<SuperVO> list) {
        for (SuperVO vo : list) {
            vo.setDr(0);
        }
    }
}
